grep from tar.gz without extracting [fast one] |
您所在的位置:网站首页 › grep zip文件 › grep from tar.gz without extracting [fast one] |
上面所有的代码真的很有帮助,但没有一个能完全满足我自己的需要。替换代码0】当前目录下的所有*.tar.gz文件,以找到一个可重复使用的脚本中指定为参数的模式来输出。 The name of both the archive file and the extracted file The line number where the pattern was found The contents of the matching line这是我真正希望zgrep能够为我做的,但它就是做不到。 Here's my solution: pattern=$1 for f in *.tar.gz; do echo "$f:" tar -xzf "$f" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true"; done如果你想用一个基本的echo语句来测试所有的变量是否正常展开,你也可以用下面这行来替换tar。 tar -xzf "$f" --to-command 'echo "f:`basename $TAR_FILENAME` s:'"$pattern\""让我解释一下发生了什么事。 希望有关档案文件名的for循环和echo是明显的。 tar -xzf。x提取,z通过gzip过滤,f基于以下存档文件。 "$f"。for循环提供的存档文件(比如你通过做ls得到的),用双引号表示,以允许变量扩展,并确保脚本不被任何带空格的文件名破坏,等等。 --to-command。将tar命令的输出传递给另一个命令,而不是真正地将文件提取到文件系统中。 在这之后的所有内容都指定了命令是什么(grep)以及我们要传递给该命令的参数。 让我们把这部分内容本身分解一下,因为它是这里的 "秘方"。 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true"首先,我们用一个单引号来开始这个块,这样,被执行的子命令(basename $TAR_FILENAME)就是not立即扩大/解决。 稍后再谈这个问题。 grep。要对(实际没有)提取的文件运行的命令 --label=。在结果前加上的标签,其值用双引号括起来,因为我们的do想让grep命令解决由tar命令传入的$TAR_FILENAME环境变量。 basename $TAR_FILENAME。以命令形式运行(周围有反斜线),删除目录路径,只输出文件名。 -Hin:H。显示文件名(由标签提供),i。不区分大小写的搜索,n。显示匹配的行数 然后我们用单引号 "结束 "命令字符串的第一部分,用双引号启动下一部分,这样作为第一个参数传入的$pattern就可以被解决。 意识到我需要在什么地方使用哪些引语,是最让我头疼的部分。 希望这一切对你来说是有意义的,并能帮助别人。 另外,我希望一年后当我再次需要它时能找到它(而且我已经忘记了我为它做的脚本!)。 自从我写下上述内容以来,已经过了几个星期,它仍然超级有用......但随着文件的堆积,搜索东西变得越来越乱,它还不够好。 我需要一种方法,通过文件的日期来限制我看的东西(只看最近的文件)。 所以这就是那段代码。 希望它是不言自明的。 if [ -z "$1" ]; then echo "Look within all tar.gz files for a string pattern, optionally only in recent files" echo "Usage: targrep [start date]" fi pattern=$1 startdatein=$2 startdate=$(date -d "$startdatein" +%s) for f in *.tar.gz; do filedate=$(date -r "$f" +%s) if [[ -z "$startdatein" ]] || [[ $filedate -ge $startdate ]]; then echo "$f:" tar -xzf "$f" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true" fi done而且我无法停止调整这个东西。 我增加了一个参数,可以通过tar文件中的输出文件的名称进行过滤。 通配符也可以工作。 使用方法。 targrep.sh [-d ] [-f ] 例子。 targrep.sh -d "1/1/2019" -f "*vehicle_models.csv" ford while getopts "d:f:" opt; do case $opt in d) startdatein=$OPTARG;; f) targetfile=$OPTARG;; esac done shift "$((OPTIND-1))" # Discard options and bring forward remaining arguments pattern=$1 echo "Searching for: $pattern" if [[ -n $targetfile ]]; then echo "in filenames: $targetfile" fi startdate=$(date -d "$startdatein" +%s) for f in *.tar.gz; do filedate=$(date -r "$f" +%s) if [[ -z "$startdatein" ]] || [[ $filedate -ge $startdate ]]; then echo "$f:" if [[ -z "$targetfile" ]]; then tar -xzf "$f" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true" else tar -xzf "$f" --no-anchored "$targetfile" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true" fi fi done |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |